iT邦幫忙

2024 iThome 鐵人賽

DAY 8
0

介紹

之前沒用過這個模式,目前的理解是相似的物件就不用一直 new,感覺很方便

原型模式實作

  1. 跟前幾篇一樣先建立會員類別
public class Member {
    private String name;
    private String age;
    
    ...        
}
  1. 這個會員多一個電腦類別
public class Computer {
    private String brand;
}
  1. 電腦類別增加 Clone 相關程式
public class Computer implements Cloneable {
    private String brand;

    @NonNull
    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }

    public String getBrand() {
        return brand;
    }

    public void setBrand(String brand) {
        this.brand = brand;
    }
}
  1. 會員類別內增加電腦類別
public class Member {
    private String name;
    private String age;
    private Computer computer;
    
    ...        
}
  1. 會員類別內增加複製方法和電腦類別建構子
public class Member implements Cloneable {
    
    ...
        
    @NonNull
    @Override
    public Member clone() throws CloneNotSupportedException{
        Member clone = new Member(this.computer);
        clone.setName(this.name);
        clone.setAge(this.age);
        return clone;
    }
    
    public Member(Computer computer) throws CloneNotSupportedException {
        this.computer = (Computer) computer.clone();
    }    
}

原型模式測試

  1. 建立基本會員,電腦品牌為刀碩
Member memberBase = new Member();
memberBase.setName("AndyAWD");
memberBase.setAge("30");

Computer computer = new Computer();
computer.setBrand("ASUS");
memberBase.setComputer(computer);
  1. 複製基本會員,新會員 1 重新設定電腦品牌為 APPLE
Member member1 = memberBase.clone();

Computer computer1 = new Computer();
computer1.setBrand("APPLE");
member1.setComputer(computer1);
  1. 複製基本會員,新會員 2 重新設定電腦品牌為 MSI
Member member2 = member.clone();

Computer computer2 = new Computer();
computer2.setBrand("MSI");
member2.setComputer(computer2);
  1. 輸出結果
基本角色 - 姓名:AndyAWD / 年齡:30 / 電腦品牌:ASUS
會員1 - 姓名:AndyAWD / 年齡:30 / 電腦品牌:APPLE
會員2 - 姓名:AndyAWD / 年齡:30 / 電腦品牌:MSI

上一篇
113/07 - 創造者模式(Builder)- Kotlin
下一篇
113/09 - 原型模式(Prototype)- Kotlin
系列文
肯定會斷賽之在 Android 開發使用設計模式30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言